perm filename QUAIL[1,BGB] blob sn#131880 filedate 1974-11-21 generic text, type T, neo UTF8
     

00100	TITLE QUAIL  -  TEXT ROUTINES.
00200	SUBR(KLTEXT,NODE)
00300	COMMENT ⊗____________________________________________________________
00400		If called with vertex, all text on that vertex is deleted.
00500		If called with a text node, only that line is deleted.
00600		Returns previous node.
00700		Uses AC 0-1, Transparent wrt to other AC's. ⊗
00800		ACCUMULATORS{LAST,NEXT}
00900		LAC 1,NODE
01000		TEST 1,VBIT
01100		GO KLLINE
01200		PTEXT 1,1		;Get text pointer
01300		JUMPE 1,POP1J.		;None there
01400		TESTZ 1,VBIT		;Is it a vertex?
01500		POP1J			;Oops, a TJOINT, return
01600		PUSHP NEXT
01700	VLOOP:	TCCW NEXT,1		;Save pointer to next node
01800		CALL(KLNODE,1)		;Kill a text node
01900		LAC 1,NEXT		;Get back pointer to next node
02000		JUMPN 1,VLOOP		;Repeat until NIL is found.
02100		POPP NEXT
02200		POP1J
02300	KLLINE:	PUSHP LAST↔PUSHP NEXT	;Save old LAST and NEXT
02400		TCW LAST,1		;Save pointer to LAST
02500	KLLOOP:	TCCW NEXT,1		;Save pointer to NEXT
02600		TEST 1,CONBIT		;Last in line?
02700		GO LAST1		;Yes
02800		CALL(KLNODE,1)		;Kill this node
02900		LAC 1,NEXT		;Get back pointer to next node
03000		GO KLLOOP		;Repeat for rest of line
03100	LAST1:	CALL(KLNODE,1)		;Kill last node in line
03200		TESTZ LAST,VBIT		;Is previous a vertex.?
03300		GO [ PTEXT. NEXT,LAST	;Yes, use a different pointer
03400		     GO LAST2 ]
03500		TCCW. NEXT,LAST		;New forward link
03600	LAST2:	JUMPE NEXT,LAST3	;Don't try to store into NIL!
03700		TCW. LAST,NEXT		;New backward link
03800	LAST3:	LAC 1,LAST
03900		POPP LAST↔POPP NEXT	;Restore AC 2 and 3
04000		POP1J
04100	
04200	ENDR KLTEXT;5/4/73(TVR)----------------------------------------------
     

00100	SUBR(SETEXT,NODE,SUBRLOC)
00200	COMMENT ⊗____________________________________________________________
00300	Called  with a  text  node  and the  address  of a  subroutine  which
00400	fetches a character  and skips if successful, with character in AC.1.
00500	SETEXT returns on failure from character fetching subroutine  or when
00600	a <line  feed> or <alt mode>  is seen.  Leaves  terminating character
00700	in AC.1. Uses AC 0-3. Calls KLTEXT. ⊗
00800		ACCUMULATORS {PTR,N}
00900		LAC N,NODE
01000	NDLOOP:	CALL SETPTR		;Set up count and byte pointer
01100	CHLOOP:	PUSHJ P,@SUBRLOC	;Call character fetching routine
01200		GO CHDONE		;Failure return
01300		JUMPE 1,CHLOOP		;Ignore nulls for now
01400		CAIN 1,15		;CROCKISHNESS!!!
01500		GO CHLOOP
01600		CAIE 1,12		;Terminate in <line feed>
01700		CAIN 1,175		;or <alt mode>
01800		GO CHDONE
01900		SOJGE 0,DEPCHR		;Make sure it fits
02000		TESTZ N,CONBIT		;Need another block
02100		GO [ TCCW N,N		;This line already has one, use it
02200		     GO GOTNODE ]
02300		PUSHP 1			;Save character over MKNODE
02400		TCCW PTR,N		;Get next node
02500		CALL(MKNODE↑,[$TEXT])	;Make a new text node
02600		TCCW. PTR,1		;Make new forward links
02700		TCCW. 1,N
02800		TCW. N,1		;Make new backward links
02900		SKIPE PTR↔TCW. 1,PTR	;Don't store into NIL
03000		MARK N,CONBIT		;Turn on bit indication this is continued
03100		LAC N,1		;Now use this node
03200		POPP 1			;Get back character
03300	GOTNOD:	CALL SETPTR		;Set up count and byte pointer
03400	DEPCHR:	IDPB 1,PTR		;Deposit character into text node
03500		GO CHLOOP		;Back for more
03600	CHDONE:	PUSHP 1			;Save terminator
03700		SETZ 1,			;Fill remainder of node with nulls
03800	ZPLOOP:	SOJGE 0,[ IDPB 1,PTR
03900			  GO ZPLOOP]
04000		TEST N,CONBIT		;Is there more on this line?
04100		GO FIN
04200		MARKZ N,CONBIT		;Turn off bit indicating more in line
04300		TCCW N,N		;Get next node
04400		CALL(KLTEXT,N)		;Kill rest of line
04500	FIN:	POPP 1			;Get terminating character
04600		POP2J			;Return
04700	
04800	SETPTR:	LAC PTR,N		;Make byte pointer to word number 1
04900		HRLI PTR,000700
05000		MOVEI 0,5*8-1		;Number of characters per node
05100		POPJ P,
05200	ENDR SETEXT;4-MAY-73(TVR)____________________________________________
     

00100	SUBR(EDTEXT,NODE)
00200	COMMENT ⊗------------------------------------------------------------
00300	⊗↔	ACCUMULATORS{T1,T2,T3,COUNT,SIGN,CHAR,N}
00400		LAC N,NODE
00500		TESTZ N,VBIT↔PY N,N
00600		JUMPE N,[ CALL (MKY,NODE,[.RLTXT])
00700			  MARK 1,VBIT
00800			  LAC N,NODE
00900			  HRLZI 0,XWC(N)	;COPY CO-ORDINATES
01000			  HRRI 0,XWC(1)
01100			  BLT 0,ZWC(1)
01200			  LAC N,1		;SET SIZE TO 1
01300			  LACI 0,1
01400			  DPSIZ. 0,N
01500			  GO NEWTXT ]
01600		SETOM EDUPDATE
01700		SETZM ENDFLG
01800		TESTZ N,VBIT↔PTEXT N,N
01900	LOOP0:	SETZ CHAR,
02000	LOOP:	CALL(EDDPY,N,["→"])
02100		SETZB COUNT,SIGN
02200		SKIPN CHAR
02300	LOOP2:	GO [ CALL(GETCHW)
02400		     LAC CHAR,1
02500		     GO .+1 ]
02600		CAIN CHAR,15↔GO LOOP2
02700		LDB 1,[POINT 2,CHAR,35-7]
02800		LAC T1,CTABS(1)
02900		LAC T2,CHAR↔ANDI T2,177
03000		CAIL T2,"0"↔CAIL T2,"9"↔GO NOTNUM
03100		TRNN CHAR,200↔GO NOTNUM
03200		IMULI COUNT,=10
03300		ADDI COUNT,-"0"(T2)
03400		GO LOOP2
03500	NOTNUM:	CAIL T2,"a"↔CAILE T2,"z"↔GO LOOP3
03600		SUBI T2,40
03700	LOOP3:	CAR 0,(T1)
03800		CAIE 0,(T2)↔AOBJN T1,LOOP3
03900		CAIE 0,(T2)
04000		GO [ TRNN CHAR,200↔GO LINED
04100	UNKNOWN:     OUTSTR[ASCIZ/Unknown command: /]
04200		     TRNE CHAR,200↔OUTSTR[ASCIZ/<control>/]
04300		     TRNE CHAR,400↔OUTSTR[ASCIZ/<meta>/]
04400		     OUTCHR CHAR↔GO LOOP0 ]
04500		CDR T2,(T1)
04600		GO(T2)
     

00100	;----- EDTEXT		;COMMAND TABLES
00200	
00300	CTABS:	FOR @` I←0,3,1
00400	<		 XWD -CLEN`I,CTAB`I
00500	>
00600	CTAB0:	XWD 12,[MOVEI 0,1↔GO MOVER]
00700		XWD 177,[MOVNI 0,1↔GO MOVER]
00800		XWD 13,[MOVNI 0,1↔GO MOVER]
00900		XWD 175,LOOP0
01000	CLEN0←←.-CTAB0
01100	CTAB1:
01200	;Commands to system line editor (includes <space> and <tab>:
01300		FOR I ε {DIKS 	}
01400	<	XWD "I",LINED
01500	>
01600		XWD 12,[MOVEI 0,1↔GO MOVER]
01700	CTAB3:	XWD 13,[MOVNI 0,1↔GO MOVER]	;VT
01800		XWD "<",[MOVNI 0,4↔GO MOVER]
01900		XWD ">",[MOVEI 0,4↔GO MOVER]
02000		XWD "≤",[MOVNI 0,16↔GO MOVER]
02100		XWD "≥",[MOVEI 0,16↔GO MOVER]
02200	
02300		XWD "↑",[MOVNI 0,1↔MOVEI CHAR,211↔GO MOVER2]
02400		XWD "↓",[MOVEI 0,1↔MOVEI CHAR,211↔GO MOVER2]
02500		XWD "Q",[TCW 1,N↔TESTZ 1,VBIT↔GO LOOP0
02600			 SETZ CHAR,↔CALL(EDSYS+1,N,CHAR)
02700			 GO LOOP]
02800		XWD "/",CHGSIZ		;SHRINK DPY CHR SIZE.
02900		XWD "\",CHGSIZ		;EXPAND DPY CHR SIZE.
03000		XWD "V",UPGEO		;REFRESH.
03100		XWD "Z",JOIN
03200		XWD "+",[MOVEI SIGN,1↔GO LOOP2]
03300		XWD "-",[SKIPN SIGN↔MOVEI SIGN,1
03400			MOVN SIGN,SIGN↔GO LOOP2]
03500		XWD "E",[EDEXIT: PGIOT 2,↔POP1J]
03600		XWD "M",[SETZM CTRL↔SETZM META
03700			CALL(NEWMAC)↔GO LOOP0]
03800		XWD "N",[SETZM CTRL↔SETZM META
03900			CALL(IFORM2)↔GO LOOP0]
04000	CLEN1←←.-CTAB1
04100		XWD 12,INSLIN
04200		XWD "I",INSLIN
04300		XWD "D",DELLIN
04400	CLEN3←←.-CTAB3
04500	CTAB2:	XWD 12,UNKNOWN
04600	CLEN2←←.-CTAB2
     

00100	;----- EDTEXT		;COMMAND ROUTINES
00200	
00300	MOVER:	SETZ CHAR,
00400	MOVER2:	SKIPN COUNT
00500		MOVEI COUNT,1
00600		IMUL COUNT,0
00700		SKIPGE SIGN
00800		MOVN COUNT,COUNT
00900		JUMPL COUNT,BACK
01000		SETZM ENDFLG
01100	FORWRD:	CALL NXTLIN,N
01200		JUMPE 1,[SETOM ENDFLG
01300			 GO LOOP]
01400		LAC N,1
01500		SOJG COUNT,FORWRD
01600		GO LOOP
01700	BACK:	SKIPE ENDFLG
01800		GO [ SETZM ENDFLG
01900		     GO BACK2 ]
02000	BACK1:	CALL PRVLIN,N
02100		TESTZ 1,VBIT
02200		GO LOOP
02300		LAC N,1
02400	BACK2:	AOJL COUNT,BACK1
02500		GO LOOP
02600	
02700	LINED:	SKIPE ENDFLG
02800		GO [ CAIL CHAR,177
02900		     GO UNKNOWN
03000		     CALL(INSTXT,N)
03100		     LAC N,1
03200		     SETZM ENDFLG
03300		     GO LINED ]
03400		CALL EDSYS,N,CHAR
03500		DAC 1,CHAR
03600		GO LOOP
03700	
03800	INSLIN:	TCW N,N
03900		JUMPG COUNT,INSLI2
04000	NEWTXT:	CALL(INSTXT,N)
04100		DAC 1,N
04200		CALL(EDDPY,N,["↔"])
04300		SETZM CLRLIN
04400		CALL(EDSYS,N,[0])
04500		CAIN 1,12
04600		GO NEWTXT
04700		GO LOOP0
04800	INSLI2:	CALL(INSTXT,N)
04900		SOJG COUNT,INSLI2
05000		CALL(PRVLIN,N)
05100		GO LOOP0
05200	
05300	DELLIN:	SKIPE ENDFLG
05400		GO LOOP0
05500		SKIPE SIGN
05600		IMULI COUNT,SIGN
05700		JUMPL COUNT,DBACK
05800	DELLI2:	CALL(KLTEXT,N)
05900		LAC N,1
06000		TESTZ N,VBIT
06100		GO [ PTEXT 1,N
06200		     GO DELLI3 ]
06300		TCCW 1,N
06400	DELLI3:	JUMPE 1,[ TESTZ N,VBIT
06500			  GO [ OUTSTR[ASCIZ/NOTHING LEFT!/]
06600			       GO EDEXIT ]
06700			  SETOM ENDFLG
06800			  GO LOOP0 ]
06900		LAC N,1
07000		SOJG COUNT,DELLI2
07100		GO LOOP0
07200	DBACK:	CALL(KLTEXT,N)
07300		LAC N,1
07400		TESTZ N,VBIT
07500		GO [ PTEXT N,N
07600		     JUMPE N,[ OUTSTR[ASCIZ/NOTHING LEFT!/]
07700			       GO EDEXIT ]
07800		     GO LOOP0 ]
07900		TLNE 0,(CONBIT)
08000		SUBI COUNT,1
08100	DBACK2: AOJL COUNT,DBACK
08200		GO LOOP0
08300	
08400	JOIN:	CALL(NXTLIN,N)
08500		JUMPE 1,LOOP0
08600		TCW 1,1
08700		MARK 1,CONBIT
08800		GO LOOP0
08900	
09000	CHGSIZ:	LAC 1,N
09100		TEST 1,VBIT
09200		GO [ TCW 1,1
09300		     GO CHGSIZ+1 ]
09400		DPSIZ 0,1
09500		CAIE CHAR,200+"/"
09600		CAIN CHAR,600+"/"
09700		SUBI 0,1
09800		CAIE CHAR,200+"\"
09900		CAIN CHAR,600+"\"
10000		ADDI 0,1
10100		ANDI 0,7	;MUMBLE
10200		DPSIZ. 0,1
10300	UPGEO:	PUSHP N
10400		CALL GEODPY
10500		POPP N
10600		GO LOOP0
10700	ENDR EDTEXT;4-MAY-73(TVR)____________________________________________
     

00100	SUBR EDSYS,NODE,CHAR		;Invoke system line editor
00200	COMMENT ⊗------------------------------------------------------------
00300	Here we gronk the system line editor ⊗
00400		ACCUMULATORS{N,C1,C2,P1,P2}
00500		EXTERNAL FILFLG,MACNOD,MACGET
00600		TDZA 0,0			;Set or clear Q command flag
00700		MOVEI 0,1
00800		DAC 0,FOOFLG
00900		LAC N,NODE			;Put text into EDBUF in preparation
01000		LAC P2,[POINT 7,EDBUF]		;for line edit
01100		MOVEI C2,5*EDBFLN-2
01200	CH1:	LAC P1,N			;For each node
01300		HRLI P1,700
01400		MOVEI C1,5*8-1
01500	CHLOOP:	ILDB 1,P1			;Pick up a character
01600		JUMPE 1,CH2			;Ignore nulls
01700		IDPB 1,P2			;Put into EDBUF
01800		SOJL C2,[OUTSTR[ASCIZ/Too long for line editor!/]	;Error check
01900			 CLRBFI↔SETZ 1,↔POP2J]
02000	CH2:	SOJG C1,CHLOOP			;For each character
02100		TESTZ N,CONBIT			;More left?
02200		GO [ TCCW N,N			;Yes
02300		     JUMPN N,CH1
02400		     GO .+1 ]
02500		MOVEI 1,15			;Make sure it ends with <return>
02600		IDPB 1,P2			
02700		SETZ 0,				;Make sure it terminated with <null>
02800		IDPB 0,P2
02900		PTLOAD [0↔EDBUF]		;Stuff it into line buffer
03000	;Here we should, but don't pick up anything typed ahead
03100		LAC 1,CHAR			;Pick up character starting command
03200		PTWR1W 0			;Put it into input buffer
03300		LAC 1,CLRLIN+1			;Turn off line to be editted
03400		PGSEL 17
03500		SKIPE CLRLIN			;Unless we're in Q command
03600		UPGMVM 1,@CLRLIN
03700		MOVEI C1,1			;Now, how many lines from top
03800		LAC 1,N
03900	CH3:	CALL(PRVLIN,1)			;Get previous node
04000		TEST 1,VBIT			;A vertex?
04100		AOJA C1,CH3			;Yes, try next back
04200		IMULI C1,-30			;Calculate line position
04300		ADDI C1,=460
04400		PPIOT 6,(C1)			;LAC line editor up there
04500		LAC 1,NODE			;Pick up node
04600		SKIPN FOOFLG			;If Q flag, then pick up display for new line
04700		GO CH4
04800		CALL(INSTXT,NODE)		;Insert a blank line to be filled
04900		DAC 1,NODE			;Save that line
05000		CALL(EDDPY,1,["→"])		;A line and cursor
05100	CH4:	SKIPN FILFLG			;In a macro mode?
05200		SKIPE MACNOD
05300		GO CH5				;Yes, handle special
05400		TTYUUO 14,			;Wait for activation character
05500	CH6:	CALL(SETEXT,NODE,[EDGET])	;Now
05600		PPIOT 6,0			;Reset page printer
05700		SETOM EDUPDATE			;Make it know this is an update
05800		LAC 1,BRKCHR			;Get back break character from line edit
05900		POP2J
06000	CH5:	CALL(MACGET)			;Get a character from macro
06100		JUMPE 1,CH4			;If zero, end of macro
06200		SETZ 0,				;Stuff character into input buffer
06300		PTWR1W 0
06400		LAC 0,1			;Get low order 7 bits
06500		ANDI 0,177
06600		CAIL 0,"a"			;Convert to upper case
06700		CAILE 0,"z"
06800		SKIPA
06900		SUBI 0,40
07000		CAIE 0,12			;<return> and <line> always terminate
07100		CAIN 0,15
07200		GO CH6
07300		CAIN 0,175			;As does <alt mode>
07400		GO CH6
07500		CAIL 1,600			;Always terminate if <control><meta>
07600		GO CH6
07700		CAIL 1,200			;Not a terminator if no control bits
07800		CAIL 1,400			;Or <meta>
07900		GO CH5
08000		CAIE 0,"S"			;Must be <control>, test each of edit commands
08100		CAIN 0,"I"
08200		GO CH5
08300		CAIE 0,"D"
08400		CAIN 0,"K"
08500		GO CH5
08600		CAIE 0,11
08700		CAIN 0,40
08800		GO CH5
08900		CAIE 0,14
09000		CAIN 0,177
09100		GO CH5
09200		GO CH6
09300	
09400	EDGET:	INCHSL 1
09500		POPJ P,
09600		CAIE 1,12
09700		CAIL 1,200
09800		GO [ DAC 1,BRKCHR
09900		     GO EDGET ]
10000		CAIN 1,15
10100		GO [ INCHSL 1
10200		     JFCL
10300		     DAC 1,BRKCHR
10400		     POPJ P,]
10500		CAIN 1,175
10600		GO BLAST
10700		AOS (P)
10800		POPJ P,
10900	
11000	BLAST:	SUB P,[XWD 4,4]
11100	BLAST0:	PPIOT 6,0
11200	BLAST1:	INCHSL 1
11300		GO BLAST2
11400		CAIE 1,15
11500		GO BLAST1
11600		INCHSL 1
11700		JFCL
11800	BLAST2:	LAC P2,[POINT 7,EDBUF]
11900		CALL(SETEXT,NODE,[EDGET2])
12000		SETZ 1,
12100		POP2J
12200	
12300	EDGET2:	ILDB 1,P2
12400		JUMPE 1,[POPJ P,]
12500		AOS(P)
12600		POPJ P,
12700	
12800	DECLARE{BRKCHR,FOOFLG}
12900	
13000	ENDR EDSYS;4-MAY-73(TVR)_____________________________________________
     

00100	SUBR(EDDPY,NODE,CURCHR)
00200	COMMENT ⊗___________________________________________________________⊗
00300		EXTERNAL DPYPTR,RIVECT,DPYBRT
00400		N←4
00500		CALL(DPYSET,DPYBUF)
00600		CALL(DPYBIG,[2])
00700		CALL(DPYBRT,[2])
00800		CALL(AIVECT,[-777],[=460])
00900		CALL(DPYSTR,[[ASCIZ/*****************
01000	/]])
01100		LAC N,NODE
01200		SETZM CURFLG
01300		SKIPA
01400	FNDBEG:	TCW N,N
01500		TEST N,VBIT
01600		GO FNDBEG
01700		PTEXT N,N
01800	DPLOOP:	SKIPN ENDFLG
01900		CAME N,NODE
02000		GO DP2
02100		CALL(DPYCUR)
02200	DP2:	MOVEI 0,1(N)
02300		CALL(DPYSTR,0)
02400		TESTZ N,CONBIT
02500		GO [ TCCW N,N
02600		     JUMPN N,DP2
02700		     FATAL(MISSING END TO TEXT)]
02800		CALL(DPCRLF)
02900		TCCW N,N
03000		JUMPN N,DPLOOP
03100	DP3:	SKIPN ENDFLG
03200		GO DP4
03300		CALL(DPYCUR)
03400	DP4:	CALL(DPYSTR,[[ASCIZ/********/]])
03500		CALL(DPCRLF)
03600		CALL(DPYOUT,[17])
03700		POP2J
03800	
03900		.PLEVEL←←.PLEVEL+1
04000	DPYCUR:	CALL(RIVECT,[-15],[0])
04100		CDR 1,DPYPTR
04200		DAC 1,CLRLIN
04300		SETOM CURFLG
04400		CALL(DTYO,CURCHR)
04500		CALL(DPYSTR,<[[BYTE(7) " ",15,0]]>)
04600		POPJ P,
04700		.PLEVEL←←.PLEVEL-1
04800	
04900	DPCRLF:	SKIPN CURFLG
05000		GO DPCRL2
05100		SETZM CURFLG
05200		MOVSI 1,000700
05300		HLLM 1,DPYPTR
05400		HRLZ 1,DPYPTR
05500		ADD 1,[XWD 1,20]
05600		DAC 1,CLRLIN+1
05700	DPCRL2:	CALL(DPYSTR,[[ASCIZ/
05800	/]])
05900		POPJ P,
06000		
06100		DECLARE{CURFLG}
06200	
06300	ENDR EDDPY;4-MAY-73(TVR)_____________________________________________
     

00100	SUBR(INSTXT,NODE)
00200	;Insert a text node in after of NODE.  Return new node in 1.
00300	;
00400	;Uses AC 0-1, Transparent to all others
00500	;Calls MKNODE
00600		ACCUMULATORS{NEXT,LAST}
00700		PUSHP NEXT
00800		PUSHP LAST
00900		LAC LAST,NODE
01000		JUMPE LAST,[FATAL(INSTXT called with NIL)]
01100		TESTZ LAST,VBIT
01200		GO L2
01300	L0:	TCCW 0,LAST
01400		JUMPE 0,L2
01500		LAC LAST,0
01600		TESTZ LAST,CONBIT
01700		GO L0
01800	L2:	CALL(MKNODE↑,[$TEXT])	;Make a new text node
01900		TESTZ LAST,VBIT		;Are we inserting at beginning of text list?
02000		GO [ PTEXT NEXT,LAST	;Yes, special pointers
02100		     PTEXT. 1,LAST
02200		     GO L1 ]
02300		TCCW NEXT,LAST		;Get next node
02400		TCCW. 1,LAST		;Make new forward link
02500	L1:	TCCW. NEXT,1
02600		TCW. LAST,1		;Make new backward links
02700		SKIPE NEXT↔TCW. 1,NEXT	;Don't store into NIL
02800		POPP LAST
02900		POPP NEXT
03000		POP1J
03100	ENDR INSTXT;4-MAY-73(TVR)____________________________________________
     

00100	SUBR(NXTLIN,NODE)
00200	COMMENT ⊗___________________________________________________________
00300	Return pointer to next line, 0 if last line. Uses AC 0-1.⊗
00400		LAC 1,NODE		;Fetch node
00500		TESTZ 1,VBIT		;Is it a vertex?
00600		GO [ PTEXT 1,1		;Yes, Next is alway the PTEXT link
00700		     POP1J ]
00800	LOOP1:	TESTZ 1,CONBIT		;Is node at end of line?
00900		GO [ TCCW 1,1		;No, get another and try again
01000		     GO LOOP1 ]
01100		TCCW 1,1		;Now the next character will be a new line
01200		POP1J			;Return
01300	ENDR NXTLIN;6-MAY-73(TVR)____________________________________________
01400	
01500	SUBR(PRVLIN,NODE)
01600	;Returns pointer to previous line or vertex if called with first line
01700	;
01800	;Uses AC 0-1
01900	;
02000		LAC 1,NODE		;Fetch node
02100		TESTZ 1,VBIT		;Lose if at vertex
02200		GO [ FATAL(PRVLIN called with VERTEX) ]
02300		TCW 1,1			;Get previous node
02400		TESTZ 1,VBIT		;Is it the vertex?
02500		POP1J			;Yes, return in
02600	LOOP:	TCW 1,1			;Find end of previous line
02700		TESTZ 1,VBIT		;Is it a line
02800		GO [ PTEXT 1,1		;No, the line starts thru PTEXT link
02900		     POP1J ]
03000		TLNE 0,(CONBIT)		;Is it an end of line?
03100		GO LOOP			;No, try next one back
03200		TCCW 1,1		;Now, go forward one and that's the line
03300		POP1J			;Now, if the first node instead of the last
03400					;were noted, this would be alot easier!
03500	ENDR PRVLIN;6-MAY-73(TVR)____________________________________________
     

00100	CLRLIN:	BLOCK 2
00200	EDBUF:	BLOCK =21
00300	EDBFLN←←.-EDBUF
00400		DECLARE{EDUPDATE,ENDFLG}
00500	END